#pragma once

class	CLinkedNode;
class	CLine;

class CEndPoint
{
public:
	CEndPoint();
	CEndPoint(const CPoint& p_point, CLinkedNode* p_pLinkedNode, CLine* p_pArrow);

	inline	CPoint& getPosition();
	inline	void	setPosition(const CPoint& p_point);

	inline	bool			inRange(const CRect& p_rect);
	inline	void			setLinkedNode(CLinkedNode* p_pLinkedNode);
	inline	CLinkedNode*	getLinkedNode();

	void	moveDelta(const CPoint& p_point);
	void	updateWithLinkedNode();


	void attach(CLinkedNode* p_pLinkedNode);
	void detach();

	friend class CLine;

private:
	CPoint			m_position;
	CLinkedNode*	m_pLinkedNode;
	CLine*			m_pArrowBelongTo;
};

CPoint& CEndPoint::getPosition()
{
	return m_position;
}

void CEndPoint::setPosition( const CPoint& p_point )
{
	m_position = p_point;
}

void CEndPoint::setLinkedNode(CLinkedNode* p_pLinkedNode)
{
	m_pLinkedNode = p_pLinkedNode;
}

CLinkedNode* CEndPoint::getLinkedNode()
{
	return m_pLinkedNode;
}

bool CEndPoint::inRange( const CRect& p_rect )
{
	return getPosition().x <= p_rect.right  && 
		   getPosition().x >= p_rect.left   &&
		   getPosition().y <= p_rect.bottom &&
		   getPosition().y >= p_rect.top;
}